為了加強記憶,詩憶總會整理前一晚的筆記。
「可是,要怎麼確保每個類別都有toString()
函式呢?」窗上映著女孩百思不解的臉。「之前學姐寫的自定義類別也沒看到這個函式呀。」
筆電在詩憶的操作下跑了一個簡單的程式。
fun main() {
println(Empty())
}
class Empty
「嗯⋯⋯就連空的class
都有toString()
,雖然出來的是詭異的結果Empty@5b2133b1
,我記得學姐說小老鼠符號後是物件存放的記憶體位置。那我用昨天學的函式搜尋法,看看空的class
有哪些函式。」
結果浮出了三個方法,equals()
、hashCode()
和toString()
。
其中hashCode()
印出的值是1528902577
。
「我的第六感和我說toString()
的值和hashCode()
的值有關係。啊,5b2133b1
的十六進位轉換成十進位不就是1528902577
嗎!」
她找到了答案,非常開心。等不及到晚上的授課時間就聯絡了唯心,相約在學校的白色咖啡屋見面。
一見到唯心之後,詩憶就迫不急待的分享她的發現。
「對唷,所有的類別都繼承了Any
類別,這三個方法就是Any
類別提供的,反過來說,Any
類別就是所有類別的先祖superclass
。」唯心看著女孩因自己肯定的話語露出更加開心的笑容,嘴角也浮出淺淺的笑意。「這些繼承來的函式是可以覆寫的,如果已經被覆寫還想呼叫先祖的函式內容,就用super.
開頭,和superclass
這個名字呼應著,很好記唷。」
「所有函式都可以覆寫嗎?」詩憶問。
「可繼承的類別只有兩種,open class
和abstract class
,前者和一般的類別沒有差別,只需要在開放覆寫的函式也加上open
,後者的函式則是加上abstract
。還有一個不是類別但可以覆寫的存在——介面interface
,裡面的函式什麼都不用加就可以開放覆寫。」唯心想了想又誠實的加上一句。「他們三者的用途差異很多人都難以分清呢。」
「⋯⋯」詩憶覺得自己就是其中一員。
看著女孩呆呆傻傻的樣子,唯心噗哧一笑,忍不住捏了捏她的臉。「妳還有我呢。」
「interface
最常被使用的原因是,相對於一個類別一次只能選擇一個可繼承類別作為根基繼承,interface
卻可以同時擴展好幾個,自由度高。而open class
和abstract class
的分別主要在於後者不能實體化,只負責讓其他類別繼承。而拿實際的東西來舉例的話——」就在她煩惱哪個例子比較好說明時,一隻優雅的貓咪跳進她的懷裡。
「學姐我想摸摸貓咪。」詩憶說著就小心地挪動步子靠過去。
貓咪趴在唯心的膝蓋上,懶洋洋地看了一眼詩憶,沒有避開她的手。
等詩憶滿足的回到她的座位後,唯心才繼續剛剛的話題。「以手機為例,abstract class
是主機板,要等外殼和其他零件裝上後才能出售;open class
是已經可以出售的手機,但提供客製化容量的選擇;interface
是各種配件,如耳機一般能搭配手機也能搭配電腦,但單獨存在時沒有辦法使用。」